<?php
/**********************************************
 *     ┌─┐       ┌─┐ + +
 *  ┌──┘ ┴───────┘ ┴──┐++
 *  │                 │
 *  │       ───       │++ + + +
 *  ███████───███████ │+
 *  │                 │+
 *  │       ─┴─       │
 *  │                 │
 *  └───┐         ┌───┘
 *      │         │
 *      │         │   + +
 *      │         │
 *      │         └──────────────┐
 *      │                        │
 *      │                        ├─┐
 *      │                        ┌─┘
 *      │                        │
 *      └─┐  ┐  ┌───────┬──┐  ┌──┘  + + + +
 *        │ ─┤ ─┤       │ ─┤ ─┤
 *        └──┴──┘       └──┴──┘  + + + +
 *          神兽保佑 代码无BUG!
 * ——————————————————————————————————————————
 * 创建时间 2025年05月2025/5/21日 00:03
 * wechat:note744917
 * email:sunjinglong@lingyier.com
 * ——————————————————————————————————————————
 */

namespace SunAdmin\Service;

use SunAdmin\Service\FileSystem\FileManager;
use SunAdmin\Service\FileSystem\Upload;
use SunAdmin\Model\AttachmentModel;
use SunAdmin\Model\FileSystemConfigModel;
use think\file\UploadedFile;

class AttachmentService
{
    /**
     * 文件上传
     */
    public static function upload(UploadedFile $file, $user_type, $uid)
    {
        $fileManager = new FileManager();
        return $fileManager->upload($file, $user_type, $uid);
    }

    /**
     * 获取上传配置信息
     */
    public static function getUploadConfig()
    {
        return Upload::initConfig();
    }

    public static function delete(int|array $attachmentIds)
    {
        if (empty($attachmentIds)) {
            throw new \Exception("附件id不存在");
        }
        if (!is_array($attachmentIds)) {
            $attachmentIds = [$attachmentIds];
        }
        
        $fileManager = new FileManager();
        $deleteService = $fileManager->getDeleteService();
        
        foreach ($attachmentIds as $id) {
            $deleteService->deleteById($id);
        }
        
        return true;
    }

    public static function getList($where = [], $page = 1, $limit = 20)
    {
        $query = AttachmentModel::where([]); // Start with a clean query builder instance
        // ID (精确匹配)
        if (!empty($where['id'])) {
            $query->where('id', $where['id']);
        }
        if (!empty($where['uploader_type'])) {
            $query->where('uploader_type', $where['uploader_type']);
        }
        if (!empty($where['uid'])) {
            $query->where('uid', $where['uid']);
        }

        // Name (模糊匹配)
        if (!empty($where['name'])) {
            $query->whereLike('name', '%' . $where['name'] . '%');
        }

        // Mime (模糊匹配)
        if (!empty($where['mime'])) {
            $query->whereLike('mime', '%' . $where['mime'] . '%');
        }

        // Ext (模糊匹配)
        if (!empty($where['ext'])) {
            $query->where('ext', 'in', $where['ext']);
        }
        if (!empty($where['type'])) {
            $query->where('type', $where['type']);
        }

        // Disk (精确匹配 - 假设通常是精确的，如果需要模糊，改回 whereLike)
        if (!empty($where['disk'])) {
            $query->where('disk', $where['disk']);
        }

        // Path (模糊匹配)
        if (!empty($where['path'])) {
            $query->whereLike('path', '%' . $where['path'] . '%');
        }

        // URL (模糊匹配)
        if (!empty($where['url'])) {
            $query->whereLike('url', '%' . $where['url'] . '%');
        }

        // Add Time Range (时间范围查询)
        if (!empty($where['add_time_range']) && is_array($where['add_time_range']) && count($where['add_time_range']) === 2) {
            $startTime = $where['add_time_range'][0];
            $endTimeStr = $where['add_time_range'][1];

            // 将结束日期的时间部分设置为 23:59:59
            // 假设 $endTimeStr 是 'YYYY-MM-DD HH:mm:ss' 或 'YYYY-MM-DD'
            // 如果是 'YYYY-MM-DD'，则直接追加时间；如果是 'YYYY-MM-DD HH:mm:ss'，则替换时间部分。
            try {
                $dateObject = new \DateTime($endTimeStr);
                $endTime = $dateObject->format('Y-m-d') . ' 23:59:59';
            } catch (\Exception $e) {
                // 如果日期格式无效，可以选择跳过此条件或记录错误
                // 为了简单起见，这里我们继续使用原始的 $endTimeStr，但实际应用中应处理此异常
                $endTime = $endTimeStr;
            }

            // Optional: Validate $startTime and $endTime as valid datetime strings if necessary
            $query->whereBetween('add_time', [$startTime, $endTime]);
        }
        $count = $query->count(); // Count before pagination and ordering for correct total
        // Clone the query for list fetching to avoid issues with count and select on the same query instance if any modifications were made for count
        $listQuery = clone $query;
        $list = $listQuery->order('id desc')->page($page, $limit)->select()->toArray();

        return compact('count', 'list');
    }
    
    /**
     * 获取文件系统配置列表
     */
    public static function getFilesystemConfigs()
    {
        return FileSystemConfigModel::order('disk_type asc')->select()->toArray();
    }

    /**
     * 更新文件系统配置
     */
    public static function updateFilesystemConfig($data)
    {
        if (empty($data['disk_name'])) {
            throw new \Exception('磁盘名称不能为空');
        }
        if (empty($data['disk_type'])) {
            throw new \Exception('驱动类型不能为空');
        }

        $diskName = $data['disk_name'];
        $diskType = $data['disk_type'];
        $configData = $data['config_data'] ?? '';
        $status = isset($data['status']) ? (int)$data['status'] : 0;
        $remark = $data['remark'] ?? '';

        // 验证JSON格式（如果有config_data）
        if (!empty($configData)) {
            $jsonData = json_decode($configData, true);
            if (json_last_error() !== JSON_ERROR_NONE) {
                throw new \Exception('配置数据格式错误，请输入有效的JSON格式');
            }
        }

        // 查找现有配置
        $existingConfig = FileSystemConfigModel::where('disk_name', $diskName)->find();
        
        if (!$existingConfig) {
            throw new \Exception('配置不存在');
        }

        // 如果要启用当前配置，需要先禁用其他所有配置
        if ($status === 1) {
            FileSystemConfigModel::where('disk_name', '<>', $diskName)->update(['status' => 0]);
        }

        // 更新现有配置
        $existingConfig->disk_type = $diskType;
        $existingConfig->config_data = $configData;
        $existingConfig->status = $status;
        $existingConfig->remark = $remark;
        $existingConfig->updated_at = date('Y-m-d H:i:s');
        $existingConfig->save();

        // 清除相关缓存
        \SunAdmin\Service\FileSystem\FilesystemBase::clearCache();

        return true;
    }
}